package org.convallaria.system.biz.util;

import org.convallaria.framework.common.constants.sys.LoginLogConstants;
import org.convallaria.system.biz.entity.SysLoginLog;

/**
 * 系统登录日志工具类
 * 
 * 功能特性：
 * - 提供登录日志相关的业务逻辑判断方法
 * - 提供登录状态等描述信息
 * - 提供登录日志数据验证方法
 * - 提供登录日志信息格式化方法
 * 
 * 设计原则：
 * - 纯静态方法，无状态
 * - 业务逻辑与实体类分离
 * - 便于单元测试
 * - 提高代码可维护性
 * 
 * @author convallaria
 * @since 1.0.0
 */
public class SysLoginLogUtils {

    // ==================== 状态判断方法 ====================

    /**
     * 判断登录是否成功
     * 
     * @param loginLog 登录日志对象
     * @return true=成功，false=失败
     */
    public static boolean isLoginSuccess(SysLoginLog loginLog) {
        if (loginLog == null || loginLog.getStatus() == null) {
            return false;
        }
        return LoginLogConstants.isLoginSuccess(loginLog.getStatus());
    }

    /**
     * 判断登录是否失败
     * 
     * @param loginLog 登录日志对象
     * @return true=失败，false=成功
     */
    public static boolean isLoginFail(SysLoginLog loginLog) {
        if (loginLog == null || loginLog.getStatus() == null) {
            return false;
        }
        return LoginLogConstants.isLoginFail(loginLog.getStatus());
    }

    /**
     * 判断登录状态是否有效
     * 
     * @param status 状态值
     * @return true=有效，false=无效
     */
    public static boolean isValidStatus(String status) {
        return LoginLogConstants.isValidLoginStatus(status);
    }

    // ==================== 数据验证方法 ====================

    /**
     * 验证登录日志信息是否完整
     * 
     * @param loginLog 登录日志对象
     * @return true=完整，false=不完整
     */
    public static boolean isValidLoginLog(SysLoginLog loginLog) {
        if (loginLog == null) {
            return false;
        }
        
        // 状态验证
        if (!isValidStatus(loginLog.getStatus())) {
            return false;
        }
        
        // 用户名验证
        if (!LoginLogConstants.isValidUserName(loginLog.getUserName())) {
            return false;
        }
        
        // IP地址验证
        if (!LoginLogConstants.isValidIpaddr(loginLog.getIpaddr())) {
            return false;
        }
        
        // 登录地点验证
        if (!LoginLogConstants.isValidLoginLocation(loginLog.getLoginLocation())) {
            return false;
        }
        
        // 浏览器验证
        if (!LoginLogConstants.isValidBrowser(loginLog.getBrowser())) {
            return false;
        }
        
        // 操作系统验证
        if (!LoginLogConstants.isValidOs(loginLog.getOs())) {
            return false;
        }
        
        // 提示消息验证
        if (!LoginLogConstants.isValidMsg(loginLog.getMsg())) {
            return false;
        }
        
        return true;
    }

    /**
     * 验证用户名格式
     * 
     * @param userName 用户名
     * @return true=有效，false=无效
     */
    public static boolean isValidUserName(String userName) {
        return LoginLogConstants.isValidUserName(userName);
    }

    /**
     * 验证IP地址格式
     * 
     * @param ipaddr IP地址
     * @return true=有效，false=无效
     */
    public static boolean isValidIpaddr(String ipaddr) {
        return LoginLogConstants.isValidIpaddr(ipaddr);
    }

    /**
     * 验证登录地点格式
     * 
     * @param loginLocation 登录地点
     * @return true=有效，false=无效
     */
    public static boolean isValidLoginLocation(String loginLocation) {
        return LoginLogConstants.isValidLoginLocation(loginLocation);
    }

    /**
     * 验证浏览器类型格式
     * 
     * @param browser 浏览器类型
     * @return true=有效，false=无效
     */
    public static boolean isValidBrowser(String browser) {
        return LoginLogConstants.isValidBrowser(browser);
    }

    /**
     * 验证操作系统格式
     * 
     * @param os 操作系统
     * @return true=有效，false=无效
     */
    public static boolean isValidOs(String os) {
        return LoginLogConstants.isValidOs(os);
    }

    /**
     * 验证提示消息格式
     * 
     * @param msg 提示消息
     * @return true=有效，false=无效
     */
    public static boolean isValidMsg(String msg) {
        return LoginLogConstants.isValidMsg(msg);
    }

    // ==================== 格式化方法 ====================

    /**
     * 格式化登录日志显示名称
     * 
     * @param loginLog 登录日志对象
     * @return 格式化后的显示名称
     */
    public static String formatDisplayName(SysLoginLog loginLog) {
        if (loginLog == null) {
            return "未知登录记录";
        }
        
        String displayName = loginLog.getUserName();
        if (displayName == null || displayName.trim().isEmpty()) {
            displayName = "未知用户";
        }
        
        return displayName;
    }

    /**
     * 格式化登录日志完整信息
     * 
     * @param loginLog 登录日志对象
     * @return 格式化后的完整信息
     */
    public static String formatLoginLogInfo(SysLoginLog loginLog) {
        if (loginLog == null) {
            return "登录日志信息为空";
        }
        
        StringBuilder sb = new StringBuilder();
        sb.append("日志ID: ").append(loginLog.getLogId()).append(", ");
        sb.append("用户名: ").append(loginLog.getUserName()).append(", ");
        sb.append("IP地址: ").append(loginLog.getIpaddr()).append(", ");
        sb.append("登录地点: ").append(loginLog.getLoginLocation()).append(", ");
        sb.append("状态: ").append(getStatusDesc(loginLog.getStatus())).append(", ");
        sb.append("浏览器: ").append(loginLog.getBrowser()).append(", ");
        sb.append("操作系统: ").append(loginLog.getOs());
        
        return sb.toString();
    }

    /**
     * 格式化登录环境信息
     * 
     * @param loginLog 登录日志对象
     * @return 格式化后的环境信息
     */
    public static String formatEnvironmentInfo(SysLoginLog loginLog) {
        if (loginLog == null) {
            return "环境信息为空";
        }
        
        StringBuilder sb = new StringBuilder();
        sb.append("浏览器: ").append(loginLog.getBrowser()).append(", ");
        sb.append("操作系统: ").append(loginLog.getOs()).append(", ");
        sb.append("IP地址: ").append(loginLog.getIpaddr()).append(", ");
        sb.append("登录地点: ").append(loginLog.getLoginLocation());
        
        return sb.toString();
    }

    // ==================== 描述信息方法 ====================

    /**
     * 获取登录状态描述
     * 
     * @param status 状态值
     * @return 状态描述
     */
    public static String getStatusDesc(String status) {
        return LoginLogConstants.getLoginStatusDesc(status);
    }

    // ==================== 业务逻辑方法 ====================

    /**
     * 判断登录日志是否可以删除
     * 
     * @param loginLog 登录日志对象
     * @return true=可以删除，false=不能删除
     */
    public static boolean canDelete(SysLoginLog loginLog) {
        if (loginLog == null) {
            return false;
        }
        
        // 所有登录日志都可以删除
        return true;
    }

    /**
     * 判断登录日志是否可以编辑
     * 
     * @param loginLog 登录日志对象
     * @return true=可以编辑，false=不能编辑
     */
    public static boolean canEdit(SysLoginLog loginLog) {
        if (loginLog == null) {
            return false;
        }
        
        // 登录日志通常不允许编辑
        return false;
    }

    /**
     * 判断登录日志是否可以使用
     * 
     * @param loginLog 登录日志对象
     * @return true=可以使用，false=不能使用
     */
    public static boolean canUse(SysLoginLog loginLog) {
        if (loginLog == null) {
            return false;
        }
        
        // 所有登录日志都可以使用
        return true;
    }

    /**
     * 判断登录日志是否为空
     * 
     * @param loginLog 登录日志对象
     * @return true=为空，false=不为空
     */
    public static boolean isEmpty(SysLoginLog loginLog) {
        if (loginLog == null) {
            return true;
        }
        
        return (loginLog.getUserName() == null || loginLog.getUserName().trim().isEmpty()) &&
               (loginLog.getIpaddr() == null || loginLog.getIpaddr().trim().isEmpty());
    }

    /**
     * 判断登录日志是否有效（非空且格式正确）
     * 
     * @param loginLog 登录日志对象
     * @return true=有效，false=无效
     */
    public static boolean isValid(SysLoginLog loginLog) {
        return !isEmpty(loginLog) && isValidLoginLog(loginLog);
    }

    /**
     * 判断是否为Chrome浏览器
     * 
     * @param loginLog 登录日志对象
     * @return true=Chrome，false=其他
     */
    public static boolean isChromeBrowser(SysLoginLog loginLog) {
        if (loginLog == null || loginLog.getBrowser() == null) {
            return false;
        }
        return loginLog.getBrowser().contains(LoginLogConstants.BROWSER_CHROME);
    }

    /**
     * 判断是否为Firefox浏览器
     * 
     * @param loginLog 登录日志对象
     * @return true=Firefox，false=其他
     */
    public static boolean isFirefoxBrowser(SysLoginLog loginLog) {
        if (loginLog == null || loginLog.getBrowser() == null) {
            return false;
        }
        return loginLog.getBrowser().contains(LoginLogConstants.BROWSER_FIREFOX);
    }

    /**
     * 判断是否为Safari浏览器
     * 
     * @param loginLog 登录日志对象
     * @return true=Safari，false=其他
     */
    public static boolean isSafariBrowser(SysLoginLog loginLog) {
        if (loginLog == null || loginLog.getBrowser() == null) {
            return false;
        }
        return loginLog.getBrowser().contains(LoginLogConstants.BROWSER_SAFARI);
    }

    /**
     * 判断是否为Windows操作系统
     * 
     * @param loginLog 登录日志对象
     * @return true=Windows，false=其他
     */
    public static boolean isWindowsOs(SysLoginLog loginLog) {
        if (loginLog == null || loginLog.getOs() == null) {
            return false;
        }
        return loginLog.getOs().contains(LoginLogConstants.OS_WINDOWS);
    }

    /**
     * 判断是否为macOS操作系统
     * 
     * @param loginLog 登录日志对象
     * @return true=macOS，false=其他
     */
    public static boolean isMacOs(SysLoginLog loginLog) {
        if (loginLog == null || loginLog.getOs() == null) {
            return false;
        }
        return loginLog.getOs().contains(LoginLogConstants.OS_MACOS);
    }

    /**
     * 判断是否为Linux操作系统
     * 
     * @param loginLog 登录日志对象
     * @return true=Linux，false=其他
     */
    public static boolean isLinuxOs(SysLoginLog loginLog) {
        if (loginLog == null || loginLog.getOs() == null) {
            return false;
        }
        return loginLog.getOs().contains(LoginLogConstants.OS_LINUX);
    }

    /**
     * 判断是否为Android操作系统
     * 
     * @param loginLog 登录日志对象
     * @return true=Android，false=其他
     */
    public static boolean isAndroidOs(SysLoginLog loginLog) {
        if (loginLog == null || loginLog.getOs() == null) {
            return false;
        }
        return loginLog.getOs().contains(LoginLogConstants.OS_ANDROID);
    }

    /**
     * 判断是否为iOS操作系统
     * 
     * @param loginLog 登录日志对象
     * @return true=iOS，false=其他
     */
    public static boolean isIosOs(SysLoginLog loginLog) {
        if (loginLog == null || loginLog.getOs() == null) {
            return false;
        }
        return loginLog.getOs().contains(LoginLogConstants.OS_IOS);
    }

    /**
     * 清理用户名（去除多余空格）
     * 
     * @param loginLog 登录日志对象
     * @return 清理后的用户名
     */
    public static String cleanUserName(SysLoginLog loginLog) {
        if (loginLog == null || loginLog.getUserName() == null) {
            return "";
        }
        return LoginLogConstants.cleanUserName(loginLog.getUserName());
    }

    /**
     * 清理IP地址（去除多余空格）
     * 
     * @param loginLog 登录日志对象
     * @return 清理后的IP地址
     */
    public static String cleanIpaddr(SysLoginLog loginLog) {
        if (loginLog == null || loginLog.getIpaddr() == null) {
            return "";
        }
        return LoginLogConstants.cleanIpaddr(loginLog.getIpaddr());
    }

    /**
     * 清理浏览器类型（去除多余空格）
     * 
     * @param loginLog 登录日志对象
     * @return 清理后的浏览器类型
     */
    public static String cleanBrowser(SysLoginLog loginLog) {
        if (loginLog == null || loginLog.getBrowser() == null) {
            return "";
        }
        return LoginLogConstants.cleanBrowser(loginLog.getBrowser());
    }

    /**
     * 清理操作系统（去除多余空格）
     * 
     * @param loginLog 登录日志对象
     * @return 清理后的操作系统
     */
    public static String cleanOs(SysLoginLog loginLog) {
        if (loginLog == null || loginLog.getOs() == null) {
            return "";
        }
        return LoginLogConstants.cleanOs(loginLog.getOs());
    }

    /**
     * 获取登录失败原因
     * 
     * @param loginLog 登录日志对象
     * @return 登录失败原因
     */
    public static String getLoginFailReason(SysLoginLog loginLog) {
        if (loginLog == null || !isLoginFail(loginLog)) {
            return "";
        }
        
        String msg = loginLog.getMsg();
        if (msg == null || msg.trim().isEmpty()) {
            return LoginLogConstants.MSG_LOGIN_FAIL;
        }
        
        return msg;
    }

    /**
     * 判断是否为可疑登录（IP地址异常）
     * 
     * @param loginLog 登录日志对象
     * @return true=可疑，false=正常
     */
    public static boolean isSuspiciousLogin(SysLoginLog loginLog) {
        if (loginLog == null || loginLog.getIpaddr() == null) {
            return false;
        }
        
        String ipaddr = loginLog.getIpaddr().trim();
        
        // 检查是否为内网IP
        if (ipaddr.startsWith("192.168.") || 
            ipaddr.startsWith("10.") || 
            ipaddr.startsWith("172.")) {
            return false;
        }
        
        // 检查是否为本地IP
        if (ipaddr.equals("127.0.0.1") || 
            ipaddr.equals("::1") || 
            ipaddr.equals("localhost")) {
            return false;
        }
        
        // 其他IP地址可能为可疑登录
        return true;
    }
}
